package com.xueyi.workflow.util;

import java.util.ArrayList;
import java.util.List;

/**
 * BPMN 生成器工厂类
 * 自动选择合适的生成器来处理不同的数据格式
 * 
 * @author xueyi
 */
public class BpmnGeneratorFactory {
    
    private static final List<AbstractBpmnGenerator> generators = new ArrayList<>();
    
    static {
        // 注册所有可用的生成器
        // 注意：顺序很重要，VueFlow 生成器应该优先于 GraphSchema 生成器
        generators.add(new VueFlowBpmnGenerator());
        generators.add(new GraphSchemaBpmnGenerator());
    }
    
    /**
     * 获取适合的 BPMN 生成器
     * 
     * @param data 流程数据
     * @return 合适的生成器
     * @throws RuntimeException 如果没有找到合适的生成器
     */
    public static AbstractBpmnGenerator getGenerator(Object data) {
        for (AbstractBpmnGenerator generator : generators) {
            if (generator.supports(data)) {
                return generator;
            }
        }
        throw new RuntimeException("没有找到支持数据格式 " + data.getClass().getSimpleName() + " 的 BPMN 生成器");
    }
    
    /**
     * 生成 BPMN XML
     * 
     * @param data 流程数据
     * @param processId 流程ID
     * @param processName 流程名称
     * @return BPMN XML 字符串
     */
    public static String generateBpmnXml(Object data, String processId, String processName) {
        AbstractBpmnGenerator generator = getGenerator(data);
        return generator.generateBpmnXml(data, processId, processName);
    }
    
    /**
     * 注册新的生成器
     * 
     * @param generator 生成器实例
     */
    public static void registerGenerator(AbstractBpmnGenerator generator) {
        generators.add(0, generator); // 添加到开头，优先检查
    }
    
    /**
     * 获取所有已注册的生成器
     * 
     * @return 生成器列表
     */
    public static List<AbstractBpmnGenerator> getAllGenerators() {
        return new ArrayList<>(generators);
    }
}
